Main Text Figures

comb_epr_plot = comb_preds %>% 
  filter(metric == "EPR") %>% 
  ggplot() +
  geom_point(aes(temp, rate, colour = curve_id), 
             filter(comb_d, metric == "EPR"), 
             size = 1.5, alpha = 0.6, 
             position = position_jitter(width = 0.5, height = 0)) +
  geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), 
              filter(comb_boot_conf_preds, metric == "EPR"), 
              fill = 'grey60', alpha = 0.3) +
  geom_line(aes(temp, .fitted, col = curve_id), linewidth = 2) +
  scale_colour_manual(values = comb_colors) + 
  labs(x = "", 
       y = "Egg Production Rate \n(eggs/female/day)",
       colour = "Month") + 
  theme_matt(base_size = 12)

comb_hs_plot = comb_preds %>% 
  filter(metric == "HF") %>% 
  ggplot() +
  geom_point(aes(temp, rate, colour = curve_id), filter(comb_d, metric == "HF"), size = 1.5, alpha = 0.6, 
             position = position_jitter(width = 0.5, height = 0)) +
  geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), filter(comb_boot_conf_preds, metric == "HF"), fill = 'grey60', alpha = 0.3) +
  geom_line(aes(temp, .fitted, col = curve_id), linewidth = 2) +
  #scale_color_brewer(type = "div", palette = 5, direction = -1) + 
  #scale_color_viridis_d(option = "mako") + 
  scale_colour_manual(values = comb_colors) + 
  labs(x = "", 
       y = "Hatching Success \n(%)",
       colour = "Month") + 
  theme_matt(base_size = 12)

comb_rf_plot = comb_preds %>% 
  filter(metric == "RF") %>% 
  ggplot() +
  geom_point(aes(temp, rate, colour = curve_id), filter(comb_d, metric == "RF"), size = 1.5, alpha = 0.6, 
             position = position_jitter(width = 0.5, height = 0)) +
  geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), filter(comb_boot_conf_preds, metric == "RF"), fill = 'grey60', alpha = 0.3) +
  geom_line(aes(temp, .fitted, col = curve_id), linewidth = 2) +
  #scale_color_brewer(type = "div", palette = 5, direction = -1) + 
  #scale_color_viridis_d(option = "mako") + 
  scale_colour_manual(values = comb_colors) + 
  labs(x = "Temperature (°C)", 
       y = "Production \n(offspring/female/day)",
       colour = "Month") + 
  theme_matt(base_size = 12)

comb_tsc = ggplot(comb_surv, aes(x=Temp, y=Surv, colour=Month)) + 
  geom_point(size=1.5, position=position_jitter(width=0.1, height=0.03)) +
  xlab("Temperature (°C)")+
  ylab("Survivorship \n(proportion survived)")+
  labs(colour = "Month") + 
  geom_hline(yintercept = 0.5, linetype = "dashed") +
  geom_smooth(method = "glm", method.args = list(family = "binomial"), se=T, linewidth = 2) +
  scale_y_continuous(breaks = c(0,1)) + 
  #scale_color_brewer(type = "div", palette = 5, direction = -1) + 
  #scale_color_viridis_d(option = "mako") + 
  scale_colour_manual(values = comb_colors) + 
  theme_matt(base_size = 12)

ggarrange(comb_epr_plot, comb_hs_plot, comb_rf_plot, comb_tsc, 
          ncol = 2, nrow = 2,
          common.legend = T, legend = "bottom", labels = "AUTO")


# ggarrange(comb_epr_plot, comb_hs_plot, comb_rf_plot, comb_tsc, nrow = 1,
#           common.legend = T, legend = "bottom")
combined_opt_coll = comb_params %>% 
  filter(metric == "RF" & term == "topt") %>% 
  ggplot(aes(x = growth_temp, y = estimate, shape = species)) + 
  geom_smooth(data = filter(comb_params, metric == "RF" & term == "topt" & curve_id != "November_2"),
              method = "lm", colour = "grey50") + 
  geom_point(size = 3, stroke = 1) + 
  scale_shape_manual(values = c(16,21)) + 
  ylab("Optimum (°C)") + 
  xlab("Collection Temperature (°C)") + 
  labs(colour = "Month") + 
  theme_matt(base_size = 12)

combined_opt_diff = comb_params %>% 
  filter(metric == "RF" & term == "topt") %>% 
  ggplot(aes(x = growth_temp, y = margin, shape = species)) +
  geom_hline(yintercept = 0, linewidth =1, linetype = "dashed") +
  geom_smooth(data = filter(comb_params, metric == "RF" & term == "topt" & curve_id != "November_2"),
              method = "lm", colour = "grey50") + 
  geom_point(size = 3, stroke = 1) + 
  ylab("Margin (°C)") + 
  xlab("Collection Temperature (°C)") + 
  scale_shape_manual(values = c(16,21)) + 
  theme_matt(base_size = 12) 

combined_ld_coll = ggplot(combined_tolerance, aes(x = Coll_temp, y = LD50, shape = species)) + 
  geom_smooth(method = "lm", colour = "grey50") + 
  geom_point(size = 3, stroke = 1) + 
  scale_shape_manual(values = c(16,21)) + 
  ylab("Thermal Tolerance (°C)") + 
  xlab("Collection Temperature (°C)") + 
  theme_matt(base_size = 12)

combined_ld_diff = ggplot(combined_tolerance, aes(x = Coll_temp, y = margin, shape = species)) +
  geom_smooth(method = "lm", colour = "grey50") + 
  geom_point(size = 3, stroke = 1) + 
  scale_shape_manual(values = c(16,21)) + 
  ylab("Warming Tolerance (°C)") + 
  xlab("Collection Temperature (°C)") + 
  theme_matt(base_size = 12)

ggarrange(combined_opt_coll, combined_opt_diff, combined_ld_coll, combined_ld_diff, ncol = 2, nrow = 2, common.legend = T,
          legend = "bottom", labels = "AUTO")

F0_rf_summary$month = factor(F0_rf_summary$month, levels = c("June", "August", "November"))
F0_rf_summary$duration = factor(F0_rf_summary$duration, levels = c("short", "long"))
F0_dur_summary$month = factor(F0_dur_summary$month, levels = c("June", "August", "November"))

param_list = list("colour" = "black",
                  "width" = 0.2) 

RF_short_db = plot(F0_RF_short, 
                   axes.title.fontsize = 10,
                   tick.fontsize = 10,
                   effsize.markersize = 3,
                   swarmplot.params = param_list,
                   rawplot.ylabel = "Production",
                   theme = ggpubr::theme_pubr())

RF_long_db = plot(F0_RF_long, 
                  axes.title.fontsize = 10,
                  tick.fontsize = 10,
                  effsize.markersize = 3,
                  swarmplot.params = param_list,
                  rawplot.ylabel = "Production",
                  theme = ggpubr::theme_pubr())

b1 = ggplot() + theme_pubclean() + ggtitle("          Short Heat Waves")
b2 = ggplot() + theme_pubclean() + ggtitle("          Long Heat Waves")
F0_fecundity_plot = ggarrange(b1, RF_short_db, b2, RF_long_db, ncol = 1, nrow = 4, heights = c(0.1, 1, 0.1, 1))
x.axis_labels = c("1" = "short", "2" = "long", "3" = "short", "4" = "long")

F0_grid = F0_rf_summary %>% 
  mutate(month = fct_relevel(month, "June", "August", "November")) %>% 
  ggplot(aes(x = duration, y = difference, colour = trait, shape = duration)) + 
  facet_grid(. ~ month) + 
  geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
  geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1.3) + 
  geom_point(size = 5, fill = "white") + 
  scale_colour_manual(values = c("body size" = "grey75", "production" = "black")) + 
  scale_shape_manual(values = c("long" = 16, "short" = 21)) + 
  scale_x_discrete(labels= x.axis_labels) +
  ggtitle("Direct Effects (F0)") + 
  xlab("") +
  ylab("Effect Size\nHeatwave - Control") + 
  ylim(-1,1.1) + 
  theme_bw(base_size = 12) + 
  theme(panel.grid = element_blank(),
        axis.text = element_text(colour = "black"),
        axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5),
        legend.position = "none")

F1_summary = bind_rows(F1_rf_effect_size, F1_bs_effect_size) %>% 
  dplyr::select(variable, difference, 
                bca_ci_low, bca_ci_high, 
                month, duration, trait, generation, off_temp) %>% 
  mutate("order_code" = paste(trait, duration, sep = "_"),
         "order_number" = case_when(
           order_code == "production_short" ~ 1,
           order_code == "production_long" ~ 2,
           order_code == "body size_short" ~ 3,
           order_code == "body size_long" ~ 4),
         month = fct_relevel(month, "June", "August", "November"))

F1_summary$order_number = factor(F1_summary$order_number, levels = c(1,2,3,4))
F1_grid = ggplot(F1_summary, aes(x = order_number, y = difference, colour = trait, shape = duration, group = trait)) +
  facet_grid(off_temp ~ month, ) + 
  geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
  geom_line() + 
  geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1) + 
  geom_point(size = 3, fill = "white") + 
  scale_colour_manual(values = c("body size" = "grey75", "production" = "black")) + 
  scale_shape_manual(values = c("long" = 16, "short" = 21)) + 
  xlim(0.5,4.5) + 
  scale_x_discrete(labels= x.axis_labels) +
  xlab("") +
  ylab("Effect Size\nHeatwave - Control") + 
  ggtitle("Transgenerational Effects (F1)") + 
  theme_bw(base_size = 12) + 
  theme(panel.grid = element_blank(),
        strip.background.x = element_blank(),
        strip.text.x = element_blank(),
        axis.text = element_text(colour = "black"),
        axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5))

ggarrange(F0_grid, F1_grid, nrow = 2, ncol = 1, heights = c(0.45,1), common.legend = T, legend = "right")

Supplemental Information

#field tpc parameters
comb_params %>%  
  mutate(curve_id = fct_relevel(curve_id, c("January", "February", "March", "April", "May", "June", 
                                            "July", "August", "September", "October", "November_1", "November_2"))) %>% 
  ggplot(aes(x = curve_id, y = estimate, colour = species)) +
  facet_wrap(term~metric, scales = 'free_y') + 
  geom_point(size = 4) +
  geom_linerange(aes(ymin = conf_lower, ymax = conf_upper)) +
  scale_colour_manual(values = c("royalblue1", "indianred2")) + 
  labs(x = "Month",
       y = "Parameter Estimate",
       colour = "Species") + 
  theme_bw(base_size = 16) +
  theme(panel.grid = element_blank(),
        axis.text.x = element_text(angle = 315, hjust = 0, vjust = 0.5))

#field tpc parameters
ggplot(comb_params, aes(x = growth_temp, y = estimate, colour = species)) +
  facet_wrap(term~metric, scales = 'free_y') + 
  geom_smooth(data = filter(comb_params, curve_id != "November_2"),
              method = "lm", se = F) + 
  geom_point(size = 4) +
  geom_linerange(aes(ymin = conf_lower, ymax = conf_upper)) +
  scale_colour_manual(values = c("royalblue1", "indianred2")) + 
  labs(x = "Collection Temperature (°C)",
       y = "Parameter Estimate",
       colour = "Species") + 
  theme_bw(base_size = 12) +
  theme(panel.grid = element_blank())

comb_params %>% 
  filter(term == "topt") %>% 
  ggplot(aes(x = growth_temp, y = margin, colour = species, group = species)) + 
  facet_grid(metric~., scales = 'free_y') + 
  geom_hline(yintercept = 0) +
  geom_smooth(data = filter(comb_params, term == "topt" & curve_id != "November_2"),
              method = "lm", se = F, linewidth = 1, colour = "black") + 
  geom_point(size = 4) +
  scale_colour_manual(values = c("royalblue1", "indianred2")) + 
  labs(x = "Collection Temperature",
       y = "Safety Margin") + 
  theme_bw(base_size = 18) +
  theme(panel.grid = element_blank())

#Subsequent Rows
F1_hs_effect_size$trait = "success"
F1_hs_effect_size$generation = "F1"

F1_total_effect_size$trait = "epr"
F1_total_effect_size$generation = "F1"

F1_rf_effect_size$trait = "production"
F1_rf_effect_size$generation = "F1"

F1_bs_effect_size$trait = "body size"
F1_bs_effect_size$generation = "F1"

F0_data = bind_rows(F0_hs_summary, F0_total_summary,F0_rf_summary, F0_size_summary) %>% 
  dplyr::select(trait, difference, bca_ci_low, bca_ci_high, month, duration, trait, generation) %>% 
  mutate("order_code" = paste(trait, duration, sep = "_"),
         "order_number" = case_when(
           order_code == "total_short" ~ 1,
           order_code == "total_long" ~ 2,
           order_code == "success_short" ~ 3,
           order_code == "success_long" ~ 4,
           order_code == "production_short" ~ 5,
           order_code == "production_long" ~ 6,
           order_code == "size_long" ~ 7),
         month = fct_relevel(month, "June", "August", "November"),
         trait = fct_relevel(trait, "total", "success", "production", "size"),
         duration = fct_relevel(duration, "short", "long"),
         group_ID = paste(month, trait, sep = "_"))

F0_data$order_number = factor(F0_data$order_number, levels = c(1,2,3,4,5,6,7))


F1_data = bind_rows(F1_total_effect_size, F1_hs_effect_size, F1_rf_effect_size, F1_bs_effect_size) %>% 
  dplyr::select(trait, difference, bca_ci_low, bca_ci_high, month, duration, generation, off_temp) %>% 
  mutate("order_code" = paste(trait, duration, sep = "_"),
         "order_number" = case_when(
           order_code == "epr_short" ~ 1,
           order_code == "epr_long" ~ 2,
           order_code == "success_short" ~ 3,
           order_code == "success_long" ~ 4,
           order_code == "production_short" ~ 5,
           order_code == "production_long" ~ 6,
           order_code == "body size_short" ~ 7,
           order_code == "body size_long" ~ 8),
         trait = if_else(trait == "epr", "total", trait),
         month = fct_relevel(month, "June", "August", "November"),
         trait = fct_relevel(trait, "total", "success", "production", "size"),
         duration = fct_relevel(duration, "short", "long"))


F1_data$order_number = factor(F1_data$order_number, levels = c(1,2,3,4,5,6,7,8))

#Top row - F0 (direct effects)
x.axis_labels = c("1" = "short", "2" = "long", "3" = "short", "4" = "long", 
                  "5" = "short", "6" = "long", "7" = "short", "8" = "long")

F0_grid = ggplot(F0_data, aes(x = duration, y = difference, colour = trait, group = group_ID)) + 
  facet_grid(. ~ month) + 
  geom_line(position = position_dodge(width = 0.7),
            linewidth = 1) + 
  geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
  geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1, 
                position = position_dodge(width = 0.7)) + 
  geom_point(size = 4, fill = "white", position = position_dodge(width = 0.7)) + 
  scale_shape_manual(values = c("long" = 16, "short" = 21)) + 
  scale_x_discrete(labels= x.axis_labels) +
  scale_colour_manual(values = c("size" = "darkgrey",
                                 "success" = "gold",
                                 "production" = "forestgreen",
                                 "total" = "cornflowerblue")) +  
  xlab("") +
  ylab("Effect Size\nHeatwave - Control") + 
  theme_bw(base_size = 12) + 
  theme(panel.grid = element_blank(),
        axis.text = element_text(colour = "black"),
        axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5),
        legend.position = "none")

#Following three rows - F1 (transgeneration / indirect effects)
F1_grid = ggplot(F1_data, aes(x = duration, y = difference, colour = trait, group = trait)) + 
  facet_grid(off_temp ~ month, ) + 
  geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
  geom_line(position = position_dodge(width = 0.5),
            linewidth = 1) + 
  geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1,
                position = position_dodge(width = 0.5)) + 
  geom_point(size = 3, fill = "white", position = position_dodge(width = 0.5)) + 
  scale_shape_manual(values = c("long" = 16, "short" = 21)) + 
  xlim(0.5,4.5) + 
  scale_x_discrete(labels= x.axis_labels) +
  scale_colour_manual(values = c("size" = "darkgrey",
                                 "success" = "gold",
                                 "production" = "forestgreen",
                                 "total" = "cornflowerblue")) + 
  xlab("") +
  ylab("Effect Size \nHeatwave - Control") + 
  theme_bw(base_size = 12) + 
  theme(panel.grid = element_blank(),
        strip.background.x = element_blank(),
        strip.text.x = element_blank(),
        axis.text = element_text(colour = "black"),
        axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5))

ggarrange(F0_grid, F1_grid, nrow = 2, ncol = 1, heights = c(0.35,1), common.legend = T, legend = "right", labels = "AUTO")

effect_corr = F1_summary %>% 
  select(trait, difference, month, duration, off_temp) %>%  
  pivot_wider(id_cols = c(month, duration, off_temp),
              names_from = trait, 
              values_from = difference)

ggplot(effect_corr, aes(x = `body size`, y = production)) + 
  geom_hline(yintercept = 0) + 
  geom_vline(xintercept = 0) + 
  geom_point(size = 3) + 
  geom_smooth(method = "lm", se = F,
              colour = "grey60",
              size = 1) + 
  labs(x = "Body Size Effect",
       y = "Production Effect") + 
  theme_matt()

#Effect of heatwave duration WITHIN treatment
F0_dur_summary %>% 
  mutate(month = fct_relevel(month, c("June", "August", "November"))) %>% 
  ggplot(aes(x = month, fill = treatment, y = difference)) + 
  geom_bar(stat = "identity", position = position_dodge(width = 0.9), colour = "black", size = 1) + 
  geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high),
                width = 0.1, size = 1,
                position = position_dodge(width = 0.9)) + 
  geom_hline(yintercept = 0) + 
  scale_fill_manual(values = c("grey30", "white")) + 
  labs(x = "",
       y = "Effect Size (Hedge's g) \n Long - Short events") + 
  theme_pubr(base_size = 18)

# How does heat wave duration affect transgenerational effects? Reaction norms shown below for effect size comparisons (heatwave - control) for different duration of parental exposure
F1_data %>% 
  dplyr::select(month, duration, off_temp, trait, difference, bca_ci_low, bca_ci_high) %>% 
  mutate("ID" = paste(month, off_temp, trait, sep = "_"),
         month = fct_relevel(month, c("June", "August", "November")),
         duration = fct_relevel(duration, c("short", "long"))) %>% 
  ggplot(aes(x = duration, y = difference, colour = month, group = ID)) + 
  facet_wrap(trait~.) + 
  geom_hline(yintercept = 0) + 
  geom_line(size = 1, position = position_dodge(width = 0.1)) + 
  geom_point(size = 2, position = position_dodge(width = 0.1)) + 
  geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high),
                size = 0.75, width = 0.1,
                position = position_dodge(width = 0.1)) + 
  labs(x = "Parental Exposure Duration", 
       y = "Effect Size (Hedge's g) \n Heatwave - Control") + 
  ylim(-5,5) + 
  theme_pubr(base_size = 18)

#Pulls out reaction norms where there's a sign change (changes from positive, neutral, or negative between duration groups) 

duration_effects = F1_data %>% 
  dplyr::select(month, duration, off_temp, trait, difference, bca_ci_low, bca_ci_high) %>% 
  mutate("ID" = paste(month, off_temp, trait, sep = "_"),
         month = fct_relevel(month, c("June", "August", "November")),
         duration = fct_relevel(duration, c("short", "long"))) %>% 
  group_by(ID, trait, duration) %>%  
  mutate("zero_diff" = case_when(
    sign(bca_ci_low) == sign(bca_ci_high) ~ "does not overlap zero",
    sign(bca_ci_low) != sign(bca_ci_high) ~ "overlaps zero"
  )) %>% 
  ungroup(duration) %>% 
  mutate("change" = case_when(
    sign(difference)[1] == sign(difference)[2] & zero_diff[1] == zero_diff[2] ~ "Same",
    sign(difference)[1] != sign(difference)[2] & zero_diff[1] == "overlaps zero" & zero_diff[2] == "overlaps zero" ~ "Same",
    sign(difference)[1] != sign(difference)[2] & zero_diff[1] == zero_diff[2] & zero_diff[1] == "does not overlap zero" ~ "Different",
    sign(difference)[1] != sign(difference)[2] & zero_diff[1] != zero_diff[2] ~ "Different",
    sign(difference)[1] == sign(difference)[2] & zero_diff[1] != zero_diff[2] ~ "Different"
  )) %>% 
  arrange(month, off_temp, trait) %>% 
  filter(change == "Different")

select_rnorms = duration_effects %>% 
  dplyr::select(-duration, -difference, -bca_ci_low, -bca_ci_high, -ID, -zero_diff) %>% 
  distinct()

sig_changes = F1_data %>% 
  dplyr::select(month, duration, off_temp, trait, difference, bca_ci_low, bca_ci_high) %>% 
  mutate("ID" = paste(month, off_temp, trait, sep = "_"),
         month = fct_relevel(month, c("June", "August", "November")),
         duration = fct_relevel(duration, c("short", "long"))) %>% 
  filter(ID %in% select_rnorms$ID)

ggplot(sig_changes, aes(x = duration, y = difference, colour = month, group = ID)) + 
  facet_wrap(trait~.) + 
  geom_hline(yintercept = 0) + 
  geom_line(size = 1, position = position_dodge(width = 0.1)) + 
  geom_point(size = 2, position = position_dodge(width = 0.1)) + 
  geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high),
                size = 0.75, width = 0.1,
                position = position_dodge(width = 0.1)) + 
  geom_label_repel(data = sig_changes %>% filter(duration == "long"), 
                   aes(label = off_temp, 
                       x = duration,
                       y = difference, 
                       color = month),
                   box.padding = 0.5,
                   nudge_x = 0.2,
                   size = 7,
                   show.legend=FALSE) + 
  labs(x = "Parental Exposure Duration", 
       y = "Effect Size (Hedge's g)\nHeatwave - Control") + 
  ylim(-5,5) + 
  theme_pubr(base_size = 18)

seasonal_cols = c("June" = "#E69F00", "August" = "#D55E00", "November" = "#0072B2")
F1_fbs$ID = paste(F1_fbs$Month, F1_fbs$Parental_treatment, F1_fbs$Day, sep = "_")
F1_fbs$Month = fct_relevel(F1_fbs$Month, "June", "August", "November")

day_cols = c("1_to_3" = "sienna1", "5_to_7" = "sienna")

size_temp1 = ggplot(F1_fbs, aes(x = Offspring_temp, y = Size, colour = Day, group = ID)) + 
  facet_grid(Month~Parental_treatment) + 
  geom_jitter(width = 0.5, size = 1.6, alpha = 0.4) +
  geom_smooth(method = "lm", size = 1.4, alpha = 0.2) + 
  labs(x = "Offspring Temperature (°C)",
       y = "Size (mm)") + 
  scale_x_continuous(breaks = c(12,17,22)) + 
  scale_colour_manual(values = day_cols) + 
  theme_bw(base_size = 15) + theme(legend.position = "bottom",
                     panel.grid = element_blank())

f1_size.model = lm(data = F1_fbs, Size ~ Offspring_temp * Parental_treatment * Month * Day)

#car::Anova(f1_size.model, type = "III")
size_temp2 = emmeans::emtrends(f1_size.model, c("Month", "Day", "Parental_treatment"), var = "Offspring_temp") %>% 
  as.data.frame() %>% 
  ggplot(aes(x = Parental_treatment, y = Offspring_temp.trend, 
             colour = Day, shape = Day, group = Day)) + 
  facet_wrap(Month~.) + 
  geom_hline(yintercept = 0) + 
  geom_point(size = 3,
             position = position_dodge(width = 0.5)) + 
  geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL),
                size = 1, width = 0.3,
                position = position_dodge(width = 0.5)) + 
  geom_line(linewidth = 1.5,
                position = position_dodge(width = 0.5)) + 
  scale_colour_manual(values = day_cols) + 
  labs(x = "Parental Treatment",  
       y = "Size Slope (mm / °C)") + 
  guides(colour = "none") + 
  theme_matt(base_size = 15) + 
  theme(legend.position = "bottom",
        axis.text.x = element_text(angle = 360-45,
                                   hjust = 0, vjust = 0.5))

ggarrange(size_temp1, size_temp2, labels = "AUTO", common.legend = T, legend = "bottom")

LS0tCnRpdGxlOiAiRmlndXJlcyBmb3IgU2Vhc29uYWxseSB2YXJpYWJsZSB0aGVybWFsIHBlcmZvcm1hbmNlIGN1cnZlcyBwcmV2ZW50IGFkdmVyc2UgZWZmZWN0cyBvZiBoZWF0d2F2ZXMiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgICAgICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgICAgICAgdG9jOiB0cnVlCiAgICAgICAgICB0b2NfZmxvYXQ6IHRydWUKICBnaXRodWJfZG9jdW1lbnQ6CiAgICAgICAgICB0b2M6IHRydWUKICAgICAgICAgIHRvY19kZXB0aDogMgogICAgICAgICAgaHRtbF9wcmV2aWV3OiBmYWxzZQplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgZmlnLmFsaWduPSJjZW50ZXIiLCBtZXNzYWdlID0gRiwgd2FybmluZyA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0ga25pdHI6OmlzX2h0bWxfb3V0cHV0KCksCiAgZmlnLmFsaWduID0gImxlZnQiLAogIGZpZy5wYXRoID0gIi4uL0ZpZ3VyZXMvbWFya2Rvd24vIiwKICBtZXNzYWdlID0gRkFMU0UsCiAgd2FybmluZyA9IEZBTFNFLAogIGNvbGxhcHNlID0gVCwKICBkZXYgPSBjKCJwbmciLCAicGRmIikKKQoKc3QuZXJyIDwtIGZ1bmN0aW9uKHgsIG5hLnJtPUZBTFNFKSB7CiAgaWYobmEucm09PVRSVUUpIHggPC0gbmEub21pdCh4KQogIHNkKHgpL3NxcnQobGVuZ3RoKHgpKQp9Cgp0aGVtZV9tYXR0ID0gZnVuY3Rpb24oYmFzZV9zaXplID0gMTgsCiAgICAgICAgICAgICAgICAgICAgICBkYXJrX3RleHQgPSAiZ3JleTIwIil7CiAgbWlkX3RleHQgPC0gIG1vbm9jaHJvbWVSOjpnZW5lcmF0ZV9wYWxldHRlKGRhcmtfdGV4dCwgImdvX2xpZ2h0ZXIiLCBuX2NvbG91cnMgPSA1KVsyXQogIGxpZ2h0X3RleHQgPC0gIG1vbm9jaHJvbWVSOjpnZW5lcmF0ZV9wYWxldHRlKGRhcmtfdGV4dCwgImdvX2xpZ2h0ZXIiLCBuX2NvbG91cnMgPSA1KVszXQogIAogIGdncHVicjo6dGhlbWVfcHVicihiYXNlX2ZhbWlseT0ic2FucyIpICUrcmVwbGFjZSUgCiAgICB0aGVtZSgKICAgICAgcGFuZWwuYmFja2dyb3VuZCAgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLCAKICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwKICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gbWlkX3RleHQsIGxpbmVoZWlnaHQgPSAxLjEpLAogICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBkYXJrX3RleHQpLAogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IG1pZF90ZXh0KSwKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbigwLCA4LCAwLCAwKSksCiAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9YmFzZV9zaXplICogMC45KSwKICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAwLjksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksCiAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAuMjUsIDAuMjUsIDAuMjUsIDAuMjUsImNtIikKICAgICkKfQoKaDFfZXByJE1vbnRoID0gZmFjdG9yKGgxX2VwciRNb250aCwgbGV2ZWxzID0gYygiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXJfMSIsICJOb3ZlbWJlcl8yIikpCgpodWRzX2gxX2VwciRNb250aCA9IGZhY3RvcihodWRzX2gxX2VwciRNb250aCwgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIpKQoKdG9uc2FfY29sb3JzID0gYygiSnVseSIgPSAiIzc5MTEwMSIsICJBdWd1c3QiID0gIiNBRDIxMDYiLCAiU2VwdGVtYmVyIiA9ICIjQ0MzNDAzIiwgCiAgICAgICAgICAgICAgICAgIk9jdG9iZXIiID0gIiNFRjVGMDgiLCAiTm92ZW1iZXJfMSIgPSAiI0YyNzAwNiIsICJOb3ZlbWJlcl8yIiA9ICIjRUVCNjBBIikKCmh1ZHNfY29sb3JzID0gYygiSmFudWFyeSIgPSAiIzA2MUIyNCIsICJGZWJydWFyeSIgPSAiIzBGNDI1NiIsICJNYXJjaCIgPSAiIzE1NkQ4RCIsIAogICAgICAgICAgICAgICAgIkFwcmlsIiA9ICIjMkZBQURDIiwgIk1heSIgPSAiIzYxQkZFMyIsICJKdW5lIiA9ICIjOTdENUVFIikKCmNvbWJfY29sb3JzID0gYyhodWRzX2NvbG9ycywgdG9uc2FfY29sb3JzKQoKYSA9IGdncGxvdCgpICsgdGhlbWVfcHViY2xlYW4oKQoKc3VydiRNb250aCA9IGZhY3RvcihzdXJ2JE1vbnRoLCBsZXZlbHMgPSBjKCJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKaHVkc19zdXJ2JE1vbnRoID0gZmFjdG9yKGh1ZHNfc3VydiRNb250aCwgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIpKQoKY29tYl9wcmVkcyRjdXJ2ZV9pZCA9IGZhY3Rvcihjb21iX3ByZWRzJGN1cnZlX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKCmNvbWJfZCRjdXJ2ZV9pZCA9IGZhY3Rvcihjb21iX2QkY3VydmVfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKCmNvbWJfc3VydiRNb250aCA9IGZhY3Rvcihjb21iX3N1cnYkTW9udGgsIAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKCmBgYAoKIyMgTWFpbiBUZXh0IEZpZ3VyZXMKYGBge3IgZmlndXJlLTItY29tYmluZWQtdHBjcywgZmlnLmhlaWdodD02fQpjb21iX2Vwcl9wbG90ID0gY29tYl9wcmVkcyAlPiUgCiAgZmlsdGVyKG1ldHJpYyA9PSAiRVBSIikgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGFlcyh0ZW1wLCByYXRlLCBjb2xvdXIgPSBjdXJ2ZV9pZCksIAogICAgICAgICAgICAgZmlsdGVyKGNvbWJfZCwgbWV0cmljID09ICJFUFIiKSwgCiAgICAgICAgICAgICBzaXplID0gMS41LCBhbHBoYSA9IDAuNiwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuNSwgaGVpZ2h0ID0gMCkpICsKICBnZW9tX3JpYmJvbihhZXModGVtcCwgeW1pbiA9IGNvbmZfbG93ZXIsIHltYXggPSBjb25mX3VwcGVyLCBncm91cCA9IGN1cnZlX2lkKSwgCiAgICAgICAgICAgICAgZmlsdGVyKGNvbWJfYm9vdF9jb25mX3ByZWRzLCBtZXRyaWMgPT0gIkVQUiIpLCAKICAgICAgICAgICAgICBmaWxsID0gJ2dyZXk2MCcsIGFscGhhID0gMC4zKSArCiAgZ2VvbV9saW5lKGFlcyh0ZW1wLCAuZml0dGVkLCBjb2wgPSBjdXJ2ZV9pZCksIGxpbmV3aWR0aCA9IDIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbWJfY29sb3JzKSArIAogIGxhYnMoeCA9ICIiLCAKICAgICAgIHkgPSAiRWdnIFByb2R1Y3Rpb24gUmF0ZSBcbihlZ2dzL2ZlbWFsZS9kYXkpIiwKICAgICAgIGNvbG91ciA9ICJNb250aCIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmNvbWJfaHNfcGxvdCA9IGNvbWJfcHJlZHMgJT4lIAogIGZpbHRlcihtZXRyaWMgPT0gIkhGIikgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGFlcyh0ZW1wLCByYXRlLCBjb2xvdXIgPSBjdXJ2ZV9pZCksIGZpbHRlcihjb21iX2QsIG1ldHJpYyA9PSAiSEYiKSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwLjYsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjUsIGhlaWdodCA9IDApKSArCiAgZ2VvbV9yaWJib24oYWVzKHRlbXAsIHltaW4gPSBjb25mX2xvd2VyLCB5bWF4ID0gY29uZl91cHBlciwgZ3JvdXAgPSBjdXJ2ZV9pZCksIGZpbHRlcihjb21iX2Jvb3RfY29uZl9wcmVkcywgbWV0cmljID09ICJIRiIpLCBmaWxsID0gJ2dyZXk2MCcsIGFscGhhID0gMC4zKSArCiAgZ2VvbV9saW5lKGFlcyh0ZW1wLCAuZml0dGVkLCBjb2wgPSBjdXJ2ZV9pZCksIGxpbmV3aWR0aCA9IDIpICsKICAjc2NhbGVfY29sb3JfYnJld2VyKHR5cGUgPSAiZGl2IiwgcGFsZXR0ZSA9IDUsIGRpcmVjdGlvbiA9IC0xKSArIAogICNzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1ha28iKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY29tYl9jb2xvcnMpICsgCiAgbGFicyh4ID0gIiIsIAogICAgICAgeSA9ICJIYXRjaGluZyBTdWNjZXNzIFxuKCUpIiwKICAgICAgIGNvbG91ciA9ICJNb250aCIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmNvbWJfcmZfcGxvdCA9IGNvbWJfcHJlZHMgJT4lIAogIGZpbHRlcihtZXRyaWMgPT0gIlJGIikgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGFlcyh0ZW1wLCByYXRlLCBjb2xvdXIgPSBjdXJ2ZV9pZCksIGZpbHRlcihjb21iX2QsIG1ldHJpYyA9PSAiUkYiKSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwLjYsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjUsIGhlaWdodCA9IDApKSArCiAgZ2VvbV9yaWJib24oYWVzKHRlbXAsIHltaW4gPSBjb25mX2xvd2VyLCB5bWF4ID0gY29uZl91cHBlciwgZ3JvdXAgPSBjdXJ2ZV9pZCksIGZpbHRlcihjb21iX2Jvb3RfY29uZl9wcmVkcywgbWV0cmljID09ICJSRiIpLCBmaWxsID0gJ2dyZXk2MCcsIGFscGhhID0gMC4zKSArCiAgZ2VvbV9saW5lKGFlcyh0ZW1wLCAuZml0dGVkLCBjb2wgPSBjdXJ2ZV9pZCksIGxpbmV3aWR0aCA9IDIpICsKICAjc2NhbGVfY29sb3JfYnJld2VyKHR5cGUgPSAiZGl2IiwgcGFsZXR0ZSA9IDUsIGRpcmVjdGlvbiA9IC0xKSArIAogICNzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1ha28iKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY29tYl9jb2xvcnMpICsgCiAgbGFicyh4ID0gIlRlbXBlcmF0dXJlICjCsEMpIiwgCiAgICAgICB5ID0gIlByb2R1Y3Rpb24gXG4ob2Zmc3ByaW5nL2ZlbWFsZS9kYXkpIiwKICAgICAgIGNvbG91ciA9ICJNb250aCIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmNvbWJfdHNjID0gZ2dwbG90KGNvbWJfc3VydiwgYWVzKHg9VGVtcCwgeT1TdXJ2LCBjb2xvdXI9TW9udGgpKSArIAogIGdlb21fcG9pbnQoc2l6ZT0xLjUsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjEsIGhlaWdodD0wLjAzKSkgKwogIHhsYWIoIlRlbXBlcmF0dXJlICjCsEMpIikrCiAgeWxhYigiU3Vydml2b3JzaGlwIFxuKHByb3BvcnRpb24gc3Vydml2ZWQpIikrCiAgbGFicyhjb2xvdXIgPSAiTW9udGgiKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iLCBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gImJpbm9taWFsIiksIHNlPVQsIGxpbmV3aWR0aCA9IDIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLDEpKSArIAogICNzY2FsZV9jb2xvcl9icmV3ZXIodHlwZSA9ICJkaXYiLCBwYWxldHRlID0gNSwgZGlyZWN0aW9uID0gLTEpICsgCiAgI3NjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAibWFrbyIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjb21iX2NvbG9ycykgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDEyKQoKZ2dhcnJhbmdlKGNvbWJfZXByX3Bsb3QsIGNvbWJfaHNfcGxvdCwgY29tYl9yZl9wbG90LCBjb21iX3RzYywgCiAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDIsCiAgICAgICAgICBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kID0gImJvdHRvbSIsIGxhYmVscyA9ICJBVVRPIikKCiMgZ2dhcnJhbmdlKGNvbWJfZXByX3Bsb3QsIGNvbWJfaHNfcGxvdCwgY29tYl9yZl9wbG90LCBjb21iX3RzYywgbnJvdyA9IDEsCiMgICAgICAgICAgIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAiYm90dG9tIikKYGBgCgpgYGB7ciBmaWd1cmUtMy1jdXJ2ZS1wYXJhbWV0ZXJzLCB3YXJuaW5nID0gRiwgbWVzc2FnZSA9IEYsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTd9CmNvbWJpbmVkX29wdF9jb2xsID0gY29tYl9wYXJhbXMgJT4lIAogIGZpbHRlcihtZXRyaWMgPT0gIlJGIiAmIHRlcm0gPT0gInRvcHQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZ3Jvd3RoX3RlbXAsIHkgPSBlc3RpbWF0ZSwgc2hhcGUgPSBzcGVjaWVzKSkgKyAKICBnZW9tX3Ntb290aChkYXRhID0gZmlsdGVyKGNvbWJfcGFyYW1zLCBtZXRyaWMgPT0gIlJGIiAmIHRlcm0gPT0gInRvcHQiICYgY3VydmVfaWQgIT0gIk5vdmVtYmVyXzIiKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBjb2xvdXIgPSAiZ3JleTUwIikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzLCBzdHJva2UgPSAxKSArIAogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LDIxKSkgKyAKICB5bGFiKCJPcHRpbXVtICjCsEMpIikgKyAKICB4bGFiKCJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlICjCsEMpIikgKyAKICBsYWJzKGNvbG91ciA9ICJNb250aCIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmNvbWJpbmVkX29wdF9kaWZmID0gY29tYl9wYXJhbXMgJT4lIAogIGZpbHRlcihtZXRyaWMgPT0gIlJGIiAmIHRlcm0gPT0gInRvcHQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZ3Jvd3RoX3RlbXAsIHkgPSBtYXJnaW4sIHNoYXBlID0gc3BlY2llcykpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPTEsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3Ntb290aChkYXRhID0gZmlsdGVyKGNvbWJfcGFyYW1zLCBtZXRyaWMgPT0gIlJGIiAmIHRlcm0gPT0gInRvcHQiICYgY3VydmVfaWQgIT0gIk5vdmVtYmVyXzIiKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBjb2xvdXIgPSAiZ3JleTUwIikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzLCBzdHJva2UgPSAxKSArIAogIHlsYWIoIk1hcmdpbiAowrBDKSIpICsgCiAgeGxhYigiQ29sbGVjdGlvbiBUZW1wZXJhdHVyZSAowrBDKSIpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMjEpKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpIAoKY29tYmluZWRfbGRfY29sbCA9IGdncGxvdChjb21iaW5lZF90b2xlcmFuY2UsIGFlcyh4ID0gQ29sbF90ZW1wLCB5ID0gTEQ1MCwgc2hhcGUgPSBzcGVjaWVzKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvdXIgPSAiZ3JleTUwIikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzLCBzdHJva2UgPSAxKSArIAogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LDIxKSkgKyAKICB5bGFiKCJUaGVybWFsIFRvbGVyYW5jZSAowrBDKSIpICsgCiAgeGxhYigiQ29sbGVjdGlvbiBUZW1wZXJhdHVyZSAowrBDKSIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmNvbWJpbmVkX2xkX2RpZmYgPSBnZ3Bsb3QoY29tYmluZWRfdG9sZXJhbmNlLCBhZXMoeCA9IENvbGxfdGVtcCwgeSA9IG1hcmdpbiwgc2hhcGUgPSBzcGVjaWVzKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJncmV5NTAiKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHN0cm9rZSA9IDEpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMjEpKSArIAogIHlsYWIoIldhcm1pbmcgVG9sZXJhbmNlICjCsEMpIikgKyAKICB4bGFiKCJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlICjCsEMpIikgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDEyKQoKZ2dhcnJhbmdlKGNvbWJpbmVkX29wdF9jb2xsLCBjb21iaW5lZF9vcHRfZGlmZiwgY29tYmluZWRfbGRfY29sbCwgY29tYmluZWRfbGRfZGlmZiwgbmNvbCA9IDIsIG5yb3cgPSAyLCBjb21tb24ubGVnZW5kID0gVCwKICAgICAgICAgIGxlZ2VuZCA9ICJib3R0b20iLCBsYWJlbHMgPSAiQVVUTyIpCmBgYAoKYGBge3J9CkYwX3JmX3N1bW1hcnkkbW9udGggPSBmYWN0b3IoRjBfcmZfc3VtbWFyeSRtb250aCwgbGV2ZWxzID0gYygiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSkKRjBfcmZfc3VtbWFyeSRkdXJhdGlvbiA9IGZhY3RvcihGMF9yZl9zdW1tYXJ5JGR1cmF0aW9uLCBsZXZlbHMgPSBjKCJzaG9ydCIsICJsb25nIikpCkYwX2R1cl9zdW1tYXJ5JG1vbnRoID0gZmFjdG9yKEYwX2R1cl9zdW1tYXJ5JG1vbnRoLCBsZXZlbHMgPSBjKCJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpKQoKcGFyYW1fbGlzdCA9IGxpc3QoImNvbG91ciIgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICAid2lkdGgiID0gMC4yKSAKClJGX3Nob3J0X2RiID0gcGxvdChGMF9SRl9zaG9ydCwgCiAgICAgICAgICAgICAgICAgICBheGVzLnRpdGxlLmZvbnRzaXplID0gMTAsCiAgICAgICAgICAgICAgICAgICB0aWNrLmZvbnRzaXplID0gMTAsCiAgICAgICAgICAgICAgICAgICBlZmZzaXplLm1hcmtlcnNpemUgPSAzLAogICAgICAgICAgICAgICAgICAgc3dhcm1wbG90LnBhcmFtcyA9IHBhcmFtX2xpc3QsCiAgICAgICAgICAgICAgICAgICByYXdwbG90LnlsYWJlbCA9ICJQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICAgICAgIHRoZW1lID0gZ2dwdWJyOjp0aGVtZV9wdWJyKCkpCgpSRl9sb25nX2RiID0gcGxvdChGMF9SRl9sb25nLCAKICAgICAgICAgICAgICAgICAgYXhlcy50aXRsZS5mb250c2l6ZSA9IDEwLAogICAgICAgICAgICAgICAgICB0aWNrLmZvbnRzaXplID0gMTAsCiAgICAgICAgICAgICAgICAgIGVmZnNpemUubWFya2Vyc2l6ZSA9IDMsCiAgICAgICAgICAgICAgICAgIHN3YXJtcGxvdC5wYXJhbXMgPSBwYXJhbV9saXN0LAogICAgICAgICAgICAgICAgICByYXdwbG90LnlsYWJlbCA9ICJQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICAgICAgdGhlbWUgPSBnZ3B1YnI6OnRoZW1lX3B1YnIoKSkKCmIxID0gZ2dwbG90KCkgKyB0aGVtZV9wdWJjbGVhbigpICsgZ2d0aXRsZSgiICAgICAgICAgIFNob3J0IEhlYXQgV2F2ZXMiKQpiMiA9IGdncGxvdCgpICsgdGhlbWVfcHViY2xlYW4oKSArIGdndGl0bGUoIiAgICAgICAgICBMb25nIEhlYXQgV2F2ZXMiKQpGMF9mZWN1bmRpdHlfcGxvdCA9IGdnYXJyYW5nZShiMSwgUkZfc2hvcnRfZGIsIGIyLCBSRl9sb25nX2RiLCBuY29sID0gMSwgbnJvdyA9IDQsIGhlaWdodHMgPSBjKDAuMSwgMSwgMC4xLCAxKSkKYGBgCgpgYGB7ciBmaWd1cmUtNC1zaW0taGVhdHdhdmUtZWZmZWN0cywgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NX0KeC5heGlzX2xhYmVscyA9IGMoIjEiID0gInNob3J0IiwgIjIiID0gImxvbmciLCAiMyIgPSAic2hvcnQiLCAiNCIgPSAibG9uZyIpCgpGMF9ncmlkID0gRjBfcmZfc3VtbWFyeSAlPiUgCiAgbXV0YXRlKG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsICJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZHVyYXRpb24sIHkgPSBkaWZmZXJlbmNlLCBjb2xvdXIgPSB0cmFpdCwgc2hhcGUgPSBkdXJhdGlvbikpICsgCiAgZmFjZXRfZ3JpZCguIH4gbW9udGgpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4zKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGJjYV9jaV9sb3csIHltYXggPSBiY2FfY2lfaGlnaCksIHdpZHRoID0gMCwgbGluZXdpZHRoID0gMS4zKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDUsIGZpbGwgPSAid2hpdGUiKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiYm9keSBzaXplIiA9ICJncmV5NzUiLCAicHJvZHVjdGlvbiIgPSAiYmxhY2siKSkgKyAKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygibG9uZyIgPSAxNiwgInNob3J0IiA9IDIxKSkgKyAKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz0geC5heGlzX2xhYmVscykgKwogIGdndGl0bGUoIkRpcmVjdCBFZmZlY3RzIChGMCkiKSArIAogIHhsYWIoIiIpICsKICB5bGFiKCJFZmZlY3QgU2l6ZVxuSGVhdHdhdmUgLSBDb250cm9sIikgKyAKICB5bGltKC0xLDEuMSkgKyAKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMikgKyAKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IC00NSwgaGp1c3QgPSAwLCB2anVzdCA9IDAuNSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKRjFfc3VtbWFyeSA9IGJpbmRfcm93cyhGMV9yZl9lZmZlY3Rfc2l6ZSwgRjFfYnNfZWZmZWN0X3NpemUpICU+JSAKICBkcGx5cjo6c2VsZWN0KHZhcmlhYmxlLCBkaWZmZXJlbmNlLCAKICAgICAgICAgICAgICAgIGJjYV9jaV9sb3csIGJjYV9jaV9oaWdoLCAKICAgICAgICAgICAgICAgIG1vbnRoLCBkdXJhdGlvbiwgdHJhaXQsIGdlbmVyYXRpb24sIG9mZl90ZW1wKSAlPiUgCiAgbXV0YXRlKCJvcmRlcl9jb2RlIiA9IHBhc3RlKHRyYWl0LCBkdXJhdGlvbiwgc2VwID0gIl8iKSwKICAgICAgICAgIm9yZGVyX251bWJlciIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAicHJvZHVjdGlvbl9zaG9ydCIgfiAxLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInByb2R1Y3Rpb25fbG9uZyIgfiAyLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImJvZHkgc2l6ZV9zaG9ydCIgfiAzLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImJvZHkgc2l6ZV9sb25nIiB+IDQpLAogICAgICAgICBtb250aCA9IGZjdF9yZWxldmVsKG1vbnRoLCAiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSkKCkYxX3N1bW1hcnkkb3JkZXJfbnVtYmVyID0gZmFjdG9yKEYxX3N1bW1hcnkkb3JkZXJfbnVtYmVyLCBsZXZlbHMgPSBjKDEsMiwzLDQpKQpGMV9ncmlkID0gZ2dwbG90KEYxX3N1bW1hcnksIGFlcyh4ID0gb3JkZXJfbnVtYmVyLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gdHJhaXQsIHNoYXBlID0gZHVyYXRpb24sIGdyb3VwID0gdHJhaXQpKSArCiAgZmFjZXRfZ3JpZChvZmZfdGVtcCB+IG1vbnRoLCApICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4zKSArCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gYmNhX2NpX2xvdywgeW1heCA9IGJjYV9jaV9oaWdoKSwgd2lkdGggPSAwLCBsaW5ld2lkdGggPSAxKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGZpbGwgPSAid2hpdGUiKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiYm9keSBzaXplIiA9ICJncmV5NzUiLCAicHJvZHVjdGlvbiIgPSAiYmxhY2siKSkgKyAKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygibG9uZyIgPSAxNiwgInNob3J0IiA9IDIxKSkgKyAKICB4bGltKDAuNSw0LjUpICsgCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9IHguYXhpc19sYWJlbHMpICsKICB4bGFiKCIiKSArCiAgeWxhYigiRWZmZWN0IFNpemVcbkhlYXR3YXZlIC0gQ29udHJvbCIpICsgCiAgZ2d0aXRsZSgiVHJhbnNnZW5lcmF0aW9uYWwgRWZmZWN0cyAoRjEpIikgKyAKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMikgKyAKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gLTQ1LCBoanVzdCA9IDAsIHZqdXN0ID0gMC41KSkKCmdnYXJyYW5nZShGMF9ncmlkLCBGMV9ncmlkLCBucm93ID0gMiwgbmNvbCA9IDEsIGhlaWdodHMgPSBjKDAuNDUsMSksIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAicmlnaHQiKQpgYGAKCiMjIFN1cHBsZW1lbnRhbCBJbmZvcm1hdGlvbiAgIApgYGB7ciBwYXJhbWV0ZXJzLW1vbnRoLCBmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD0xMX0KI2ZpZWxkIHRwYyBwYXJhbWV0ZXJzCmNvbWJfcGFyYW1zICU+JSAgCiAgbXV0YXRlKGN1cnZlX2lkID0gZmN0X3JlbGV2ZWwoY3VydmVfaWQsIGMoIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXJfMSIsICJOb3ZlbWJlcl8yIikpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY3VydmVfaWQsIHkgPSBlc3RpbWF0ZSwgY29sb3VyID0gc3BlY2llcykpICsKICBmYWNldF93cmFwKHRlcm1+bWV0cmljLCBzY2FsZXMgPSAnZnJlZV95JykgKyAKICBnZW9tX3BvaW50KHNpemUgPSA0KSArCiAgZ2VvbV9saW5lcmFuZ2UoYWVzKHltaW4gPSBjb25mX2xvd2VyLCB5bWF4ID0gY29uZl91cHBlcikpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoInJveWFsYmx1ZTEiLCAiaW5kaWFucmVkMiIpKSArIAogIGxhYnMoeCA9ICJNb250aCIsCiAgICAgICB5ID0gIlBhcmFtZXRlciBFc3RpbWF0ZSIsCiAgICAgICBjb2xvdXIgPSAiU3BlY2llcyIpICsgCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzE1LCBoanVzdCA9IDAsIHZqdXN0ID0gMC41KSkKYGBgCgpgYGB7ciBwYXJhbWV0ZXJzLWNvbGwtdGVtcCwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OX0KI2ZpZWxkIHRwYyBwYXJhbWV0ZXJzCmdncGxvdChjb21iX3BhcmFtcywgYWVzKHggPSBncm93dGhfdGVtcCwgeSA9IGVzdGltYXRlLCBjb2xvdXIgPSBzcGVjaWVzKSkgKwogIGZhY2V0X3dyYXAodGVybX5tZXRyaWMsIHNjYWxlcyA9ICdmcmVlX3knKSArIAogIGdlb21fc21vb3RoKGRhdGEgPSBmaWx0ZXIoY29tYl9wYXJhbXMsIGN1cnZlX2lkICE9ICJOb3ZlbWJlcl8yIiksCiAgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwgc2UgPSBGKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICBnZW9tX2xpbmVyYW5nZShhZXMoeW1pbiA9IGNvbmZfbG93ZXIsIHltYXggPSBjb25mX3VwcGVyKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygicm95YWxibHVlMSIsICJpbmRpYW5yZWQyIikpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcGVyYXR1cmUgKMKwQykiLAogICAgICAgeSA9ICJQYXJhbWV0ZXIgRXN0aW1hdGUiLAogICAgICAgY29sb3VyID0gIlNwZWNpZXMiKSArIAogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDEyKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBtYXJnaW5zLWNvbGwtdGVtcCwgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9N30KY29tYl9wYXJhbXMgJT4lIAogIGZpbHRlcih0ZXJtID09ICJ0b3B0IikgJT4lIAogIGdncGxvdChhZXMoeCA9IGdyb3d0aF90ZW1wLCB5ID0gbWFyZ2luLCBjb2xvdXIgPSBzcGVjaWVzLCBncm91cCA9IHNwZWNpZXMpKSArIAogIGZhY2V0X2dyaWQobWV0cmljfi4sIHNjYWxlcyA9ICdmcmVlX3knKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3Ntb290aChkYXRhID0gZmlsdGVyKGNvbWJfcGFyYW1zLCB0ZXJtID09ICJ0b3B0IiAmIGN1cnZlX2lkICE9ICJOb3ZlbWJlcl8yIiksCiAgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwgc2UgPSBGLCBsaW5ld2lkdGggPSAxLCBjb2xvdXIgPSAiYmxhY2siKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoInJveWFsYmx1ZTEiLCAiaW5kaWFucmVkMiIpKSArIAogIGxhYnMoeCA9ICJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlIiwKICAgICAgIHkgPSAiU2FmZXR5IE1hcmdpbiIpICsgCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTgpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIGVmZmVjdC1zaXplLWdyaWQsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTh9CiNTdWJzZXF1ZW50IFJvd3MKRjFfaHNfZWZmZWN0X3NpemUkdHJhaXQgPSAic3VjY2VzcyIKRjFfaHNfZWZmZWN0X3NpemUkZ2VuZXJhdGlvbiA9ICJGMSIKCkYxX3RvdGFsX2VmZmVjdF9zaXplJHRyYWl0ID0gImVwciIKRjFfdG90YWxfZWZmZWN0X3NpemUkZ2VuZXJhdGlvbiA9ICJGMSIKCkYxX3JmX2VmZmVjdF9zaXplJHRyYWl0ID0gInByb2R1Y3Rpb24iCkYxX3JmX2VmZmVjdF9zaXplJGdlbmVyYXRpb24gPSAiRjEiCgpGMV9ic19lZmZlY3Rfc2l6ZSR0cmFpdCA9ICJib2R5IHNpemUiCkYxX2JzX2VmZmVjdF9zaXplJGdlbmVyYXRpb24gPSAiRjEiCgpGMF9kYXRhID0gYmluZF9yb3dzKEYwX2hzX3N1bW1hcnksIEYwX3RvdGFsX3N1bW1hcnksRjBfcmZfc3VtbWFyeSwgRjBfc2l6ZV9zdW1tYXJ5KSAlPiUgCiAgZHBseXI6OnNlbGVjdCh0cmFpdCwgZGlmZmVyZW5jZSwgYmNhX2NpX2xvdywgYmNhX2NpX2hpZ2gsIG1vbnRoLCBkdXJhdGlvbiwgdHJhaXQsIGdlbmVyYXRpb24pICU+JSAKICBtdXRhdGUoIm9yZGVyX2NvZGUiID0gcGFzdGUodHJhaXQsIGR1cmF0aW9uLCBzZXAgPSAiXyIpLAogICAgICAgICAib3JkZXJfbnVtYmVyIiA9IGNhc2Vfd2hlbigKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJ0b3RhbF9zaG9ydCIgfiAxLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInRvdGFsX2xvbmciIH4gMiwKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJzdWNjZXNzX3Nob3J0IiB+IDMsCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAic3VjY2Vzc19sb25nIiB+IDQsCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAicHJvZHVjdGlvbl9zaG9ydCIgfiA1LAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInByb2R1Y3Rpb25fbG9uZyIgfiA2LAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInNpemVfbG9uZyIgfiA3KSwKICAgICAgICAgbW9udGggPSBmY3RfcmVsZXZlbChtb250aCwgIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIiksCiAgICAgICAgIHRyYWl0ID0gZmN0X3JlbGV2ZWwodHJhaXQsICJ0b3RhbCIsICJzdWNjZXNzIiwgInByb2R1Y3Rpb24iLCAic2l6ZSIpLAogICAgICAgICBkdXJhdGlvbiA9IGZjdF9yZWxldmVsKGR1cmF0aW9uLCAic2hvcnQiLCAibG9uZyIpLAogICAgICAgICBncm91cF9JRCA9IHBhc3RlKG1vbnRoLCB0cmFpdCwgc2VwID0gIl8iKSkKCkYwX2RhdGEkb3JkZXJfbnVtYmVyID0gZmFjdG9yKEYwX2RhdGEkb3JkZXJfbnVtYmVyLCBsZXZlbHMgPSBjKDEsMiwzLDQsNSw2LDcpKQoKCkYxX2RhdGEgPSBiaW5kX3Jvd3MoRjFfdG90YWxfZWZmZWN0X3NpemUsIEYxX2hzX2VmZmVjdF9zaXplLCBGMV9yZl9lZmZlY3Rfc2l6ZSwgRjFfYnNfZWZmZWN0X3NpemUpICU+JSAKICBkcGx5cjo6c2VsZWN0KHRyYWl0LCBkaWZmZXJlbmNlLCBiY2FfY2lfbG93LCBiY2FfY2lfaGlnaCwgbW9udGgsIGR1cmF0aW9uLCBnZW5lcmF0aW9uLCBvZmZfdGVtcCkgJT4lIAogIG11dGF0ZSgib3JkZXJfY29kZSIgPSBwYXN0ZSh0cmFpdCwgZHVyYXRpb24sIHNlcCA9ICJfIiksCiAgICAgICAgICJvcmRlcl9udW1iZXIiID0gY2FzZV93aGVuKAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImVwcl9zaG9ydCIgfiAxLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImVwcl9sb25nIiB+IDIsCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAic3VjY2Vzc19zaG9ydCIgfiAzLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInN1Y2Nlc3NfbG9uZyIgfiA0LAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInByb2R1Y3Rpb25fc2hvcnQiIH4gNSwKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJwcm9kdWN0aW9uX2xvbmciIH4gNiwKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJib2R5IHNpemVfc2hvcnQiIH4gNywKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJib2R5IHNpemVfbG9uZyIgfiA4KSwKICAgICAgICAgdHJhaXQgPSBpZl9lbHNlKHRyYWl0ID09ICJlcHIiLCAidG90YWwiLCB0cmFpdCksCiAgICAgICAgIG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsICJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpLAogICAgICAgICB0cmFpdCA9IGZjdF9yZWxldmVsKHRyYWl0LCAidG90YWwiLCAic3VjY2VzcyIsICJwcm9kdWN0aW9uIiwgInNpemUiKSwKICAgICAgICAgZHVyYXRpb24gPSBmY3RfcmVsZXZlbChkdXJhdGlvbiwgInNob3J0IiwgImxvbmciKSkKCgpGMV9kYXRhJG9yZGVyX251bWJlciA9IGZhY3RvcihGMV9kYXRhJG9yZGVyX251bWJlciwgbGV2ZWxzID0gYygxLDIsMyw0LDUsNiw3LDgpKQoKI1RvcCByb3cgLSBGMCAoZGlyZWN0IGVmZmVjdHMpCnguYXhpc19sYWJlbHMgPSBjKCIxIiA9ICJzaG9ydCIsICIyIiA9ICJsb25nIiwgIjMiID0gInNob3J0IiwgIjQiID0gImxvbmciLCAKICAgICAgICAgICAgICAgICAgIjUiID0gInNob3J0IiwgIjYiID0gImxvbmciLCAiNyIgPSAic2hvcnQiLCAiOCIgPSAibG9uZyIpCgpGMF9ncmlkID0gZ2dwbG90KEYwX2RhdGEsIGFlcyh4ID0gZHVyYXRpb24sIHkgPSBkaWZmZXJlbmNlLCBjb2xvdXIgPSB0cmFpdCwgZ3JvdXAgPSBncm91cF9JRCkpICsgCiAgZmFjZXRfZ3JpZCguIH4gbW9udGgpICsgCiAgZ2VvbV9saW5lKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjcpLAogICAgICAgICAgICBsaW5ld2lkdGggPSAxKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91ciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMykgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLCB3aWR0aCA9IDAsIGxpbmV3aWR0aCA9IDEsIAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNykpICsgCiAgZ2VvbV9wb2ludChzaXplID0gNCwgZmlsbCA9ICJ3aGl0ZSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjcpKSArIAogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJsb25nIiA9IDE2LCAic2hvcnQiID0gMjEpKSArIAogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPSB4LmF4aXNfbGFiZWxzKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJzaXplIiA9ICJkYXJrZ3JleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWNjZXNzIiA9ICJnb2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2R1Y3Rpb24iID0gImZvcmVzdGdyZWVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIiA9ICJjb3JuZmxvd2VyYmx1ZSIpKSArICAKICB4bGFiKCIiKSArCiAgeWxhYigiRWZmZWN0IFNpemVcbkhlYXR3YXZlIC0gQ29udHJvbCIpICsgCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTIpICsgCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCiNGb2xsb3dpbmcgdGhyZWUgcm93cyAtIEYxICh0cmFuc2dlbmVyYXRpb24gLyBpbmRpcmVjdCBlZmZlY3RzKQpGMV9ncmlkID0gZ2dwbG90KEYxX2RhdGEsIGFlcyh4ID0gZHVyYXRpb24sIHkgPSBkaWZmZXJlbmNlLCBjb2xvdXIgPSB0cmFpdCwgZ3JvdXAgPSB0cmFpdCkpICsgCiAgZmFjZXRfZ3JpZChvZmZfdGVtcCB+IG1vbnRoLCApICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4zKSArCiAgZ2VvbV9saW5lKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICBsaW5ld2lkdGggPSAxKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLCB3aWR0aCA9IDAsIGxpbmV3aWR0aCA9IDEsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzLCBmaWxsID0gIndoaXRlIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoImxvbmciID0gMTYsICJzaG9ydCIgPSAyMSkpICsgCiAgeGxpbSgwLjUsNC41KSArIAogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPSB4LmF4aXNfbGFiZWxzKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJzaXplIiA9ICJkYXJrZ3JleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWNjZXNzIiA9ICJnb2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2R1Y3Rpb24iID0gImZvcmVzdGdyZWVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIiA9ICJjb3JuZmxvd2VyYmx1ZSIpKSArIAogIHhsYWIoIiIpICsKICB5bGFiKCJFZmZlY3QgU2l6ZSBcbkhlYXR3YXZlIC0gQ29udHJvbCIpICsgCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTIpICsgCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IC00NSwgaGp1c3QgPSAwLCB2anVzdCA9IDAuNSkpCgpnZ2FycmFuZ2UoRjBfZ3JpZCwgRjFfZ3JpZCwgbnJvdyA9IDIsIG5jb2wgPSAxLCBoZWlnaHRzID0gYygwLjM1LDEpLCBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kID0gInJpZ2h0IiwgbGFiZWxzID0gIkFVVE8iKQpgYGAKCmBgYHtyIHByb2R1Y3Rpb24tc2l6ZS1jaGFuZ2V9CmVmZmVjdF9jb3JyID0gRjFfc3VtbWFyeSAlPiUgCiAgc2VsZWN0KHRyYWl0LCBkaWZmZXJlbmNlLCBtb250aCwgZHVyYXRpb24sIG9mZl90ZW1wKSAlPiUgIAogIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBjKG1vbnRoLCBkdXJhdGlvbiwgb2ZmX3RlbXApLAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSB0cmFpdCwgCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBkaWZmZXJlbmNlKQoKZ2dwbG90KGVmZmVjdF9jb3JyLCBhZXMoeCA9IGBib2R5IHNpemVgLCB5ID0gcHJvZHVjdGlvbikpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLAogICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NjAiLAogICAgICAgICAgICAgIHNpemUgPSAxKSArIAogIGxhYnMoeCA9ICJCb2R5IFNpemUgRWZmZWN0IiwKICAgICAgIHkgPSAiUHJvZHVjdGlvbiBFZmZlY3QiKSArIAogIHRoZW1lX21hdHQoKQpgYGAKCgpgYGB7ciBGMC1wcm9kdWN0aW9uLCBmaWcuaGVpZ2h0PTExLCBmaWcud2lkdGg9OCwgaW5jbHVkZSA9IEZ9CiNGMF9mZWN1bmRpdHlfcGxvdApgYGAKCmBgYHtyIEYwLWR1cmF0aW9uLWVmZmVjdHMsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTh9CiNFZmZlY3Qgb2YgaGVhdHdhdmUgZHVyYXRpb24gV0lUSElOIHRyZWF0bWVudApGMF9kdXJfc3VtbWFyeSAlPiUgCiAgbXV0YXRlKG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsIGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gbW9udGgsIGZpbGwgPSB0cmVhdG1lbnQsIHkgPSBkaWZmZXJlbmNlKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjEsIHNpemUgPSAxLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSkpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzAiLCAid2hpdGUiKSkgKyAKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiRWZmZWN0IFNpemUgKEhlZGdlJ3MgZykgXG4gTG9uZyAtIFNob3J0IGV2ZW50cyIpICsgCiAgdGhlbWVfcHVicihiYXNlX3NpemUgPSAxOCkKYGBgCgpgYGB7ciBGMS1kdXJhdGlvbi1lZmZlY3RzLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD04fQojIEhvdyBkb2VzIGhlYXQgd2F2ZSBkdXJhdGlvbiBhZmZlY3QgdHJhbnNnZW5lcmF0aW9uYWwgZWZmZWN0cz8gUmVhY3Rpb24gbm9ybXMgc2hvd24gYmVsb3cgZm9yIGVmZmVjdCBzaXplIGNvbXBhcmlzb25zIChoZWF0d2F2ZSAtIGNvbnRyb2wpIGZvciBkaWZmZXJlbnQgZHVyYXRpb24gb2YgcGFyZW50YWwgZXhwb3N1cmUKRjFfZGF0YSAlPiUgCiAgZHBseXI6OnNlbGVjdChtb250aCwgZHVyYXRpb24sIG9mZl90ZW1wLCB0cmFpdCwgZGlmZmVyZW5jZSwgYmNhX2NpX2xvdywgYmNhX2NpX2hpZ2gpICU+JSAKICBtdXRhdGUoIklEIiA9IHBhc3RlKG1vbnRoLCBvZmZfdGVtcCwgdHJhaXQsIHNlcCA9ICJfIiksCiAgICAgICAgIG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsIGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpLAogICAgICAgICBkdXJhdGlvbiA9IGZjdF9yZWxldmVsKGR1cmF0aW9uLCBjKCJzaG9ydCIsICJsb25nIikpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZHVyYXRpb24sIHkgPSBkaWZmZXJlbmNlLCBjb2xvdXIgPSBtb250aCwgZ3JvdXAgPSBJRCkpICsgCiAgZmFjZXRfd3JhcCh0cmFpdH4uKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgCiAgZ2VvbV9saW5lKHNpemUgPSAxLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4xKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4xKSkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gYmNhX2NpX2xvdywgeW1heCA9IGJjYV9jaV9oaWdoKSwKICAgICAgICAgICAgICAgIHNpemUgPSAwLjc1LCB3aWR0aCA9IDAuMSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjEpKSArIAogIGxhYnMoeCA9ICJQYXJlbnRhbCBFeHBvc3VyZSBEdXJhdGlvbiIsIAogICAgICAgeSA9ICJFZmZlY3QgU2l6ZSAoSGVkZ2UncyBnKSBcbiBIZWF0d2F2ZSAtIENvbnRyb2wiKSArIAogIHlsaW0oLTUsNSkgKyAKICB0aGVtZV9wdWJyKGJhc2Vfc2l6ZSA9IDE4KQpgYGAKCgpgYGB7ciBzaWctRjEtZHVyYXRpb24tZWZmZWN0cywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KI1B1bGxzIG91dCByZWFjdGlvbiBub3JtcyB3aGVyZSB0aGVyZSdzIGEgc2lnbiBjaGFuZ2UgKGNoYW5nZXMgZnJvbSBwb3NpdGl2ZSwgbmV1dHJhbCwgb3IgbmVnYXRpdmUgYmV0d2VlbiBkdXJhdGlvbiBncm91cHMpIAoKZHVyYXRpb25fZWZmZWN0cyA9IEYxX2RhdGEgJT4lIAogIGRwbHlyOjpzZWxlY3QobW9udGgsIGR1cmF0aW9uLCBvZmZfdGVtcCwgdHJhaXQsIGRpZmZlcmVuY2UsIGJjYV9jaV9sb3csIGJjYV9jaV9oaWdoKSAlPiUgCiAgbXV0YXRlKCJJRCIgPSBwYXN0ZShtb250aCwgb2ZmX3RlbXAsIHRyYWl0LCBzZXAgPSAiXyIpLAogICAgICAgICBtb250aCA9IGZjdF9yZWxldmVsKG1vbnRoLCBjKCJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpKSwKICAgICAgICAgZHVyYXRpb24gPSBmY3RfcmVsZXZlbChkdXJhdGlvbiwgYygic2hvcnQiLCAibG9uZyIpKSkgJT4lIAogIGdyb3VwX2J5KElELCB0cmFpdCwgZHVyYXRpb24pICU+JSAgCiAgbXV0YXRlKCJ6ZXJvX2RpZmYiID0gY2FzZV93aGVuKAogICAgc2lnbihiY2FfY2lfbG93KSA9PSBzaWduKGJjYV9jaV9oaWdoKSB+ICJkb2VzIG5vdCBvdmVybGFwIHplcm8iLAogICAgc2lnbihiY2FfY2lfbG93KSAhPSBzaWduKGJjYV9jaV9oaWdoKSB+ICJvdmVybGFwcyB6ZXJvIgogICkpICU+JSAKICB1bmdyb3VwKGR1cmF0aW9uKSAlPiUgCiAgbXV0YXRlKCJjaGFuZ2UiID0gY2FzZV93aGVuKAogICAgc2lnbihkaWZmZXJlbmNlKVsxXSA9PSBzaWduKGRpZmZlcmVuY2UpWzJdICYgemVyb19kaWZmWzFdID09IHplcm9fZGlmZlsyXSB+ICJTYW1lIiwKICAgIHNpZ24oZGlmZmVyZW5jZSlbMV0gIT0gc2lnbihkaWZmZXJlbmNlKVsyXSAmIHplcm9fZGlmZlsxXSA9PSAib3ZlcmxhcHMgemVybyIgJiB6ZXJvX2RpZmZbMl0gPT0gIm92ZXJsYXBzIHplcm8iIH4gIlNhbWUiLAogICAgc2lnbihkaWZmZXJlbmNlKVsxXSAhPSBzaWduKGRpZmZlcmVuY2UpWzJdICYgemVyb19kaWZmWzFdID09IHplcm9fZGlmZlsyXSAmIHplcm9fZGlmZlsxXSA9PSAiZG9lcyBub3Qgb3ZlcmxhcCB6ZXJvIiB+ICJEaWZmZXJlbnQiLAogICAgc2lnbihkaWZmZXJlbmNlKVsxXSAhPSBzaWduKGRpZmZlcmVuY2UpWzJdICYgemVyb19kaWZmWzFdICE9IHplcm9fZGlmZlsyXSB+ICJEaWZmZXJlbnQiLAogICAgc2lnbihkaWZmZXJlbmNlKVsxXSA9PSBzaWduKGRpZmZlcmVuY2UpWzJdICYgemVyb19kaWZmWzFdICE9IHplcm9fZGlmZlsyXSB+ICJEaWZmZXJlbnQiCiAgKSkgJT4lIAogIGFycmFuZ2UobW9udGgsIG9mZl90ZW1wLCB0cmFpdCkgJT4lIAogIGZpbHRlcihjaGFuZ2UgPT0gIkRpZmZlcmVudCIpCgpzZWxlY3Rfcm5vcm1zID0gZHVyYXRpb25fZWZmZWN0cyAlPiUgCiAgZHBseXI6OnNlbGVjdCgtZHVyYXRpb24sIC1kaWZmZXJlbmNlLCAtYmNhX2NpX2xvdywgLWJjYV9jaV9oaWdoLCAtSUQsIC16ZXJvX2RpZmYpICU+JSAKICBkaXN0aW5jdCgpCgpzaWdfY2hhbmdlcyA9IEYxX2RhdGEgJT4lIAogIGRwbHlyOjpzZWxlY3QobW9udGgsIGR1cmF0aW9uLCBvZmZfdGVtcCwgdHJhaXQsIGRpZmZlcmVuY2UsIGJjYV9jaV9sb3csIGJjYV9jaV9oaWdoKSAlPiUgCiAgbXV0YXRlKCJJRCIgPSBwYXN0ZShtb250aCwgb2ZmX3RlbXAsIHRyYWl0LCBzZXAgPSAiXyIpLAogICAgICAgICBtb250aCA9IGZjdF9yZWxldmVsKG1vbnRoLCBjKCJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpKSwKICAgICAgICAgZHVyYXRpb24gPSBmY3RfcmVsZXZlbChkdXJhdGlvbiwgYygic2hvcnQiLCAibG9uZyIpKSkgJT4lIAogIGZpbHRlcihJRCAlaW4lIHNlbGVjdF9ybm9ybXMkSUQpCgpnZ3Bsb3Qoc2lnX2NoYW5nZXMsIGFlcyh4ID0gZHVyYXRpb24sIHkgPSBkaWZmZXJlbmNlLCBjb2xvdXIgPSBtb250aCwgZ3JvdXAgPSBJRCkpICsgCiAgZmFjZXRfd3JhcCh0cmFpdH4uKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgCiAgZ2VvbV9saW5lKHNpemUgPSAxLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4xKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4xKSkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gYmNhX2NpX2xvdywgeW1heCA9IGJjYV9jaV9oaWdoKSwKICAgICAgICAgICAgICAgIHNpemUgPSAwLjc1LCB3aWR0aCA9IDAuMSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjEpKSArIAogIGdlb21fbGFiZWxfcmVwZWwoZGF0YSA9IHNpZ19jaGFuZ2VzICU+JSBmaWx0ZXIoZHVyYXRpb24gPT0gImxvbmciKSwgCiAgICAgICAgICAgICAgICAgICBhZXMobGFiZWwgPSBvZmZfdGVtcCwgCiAgICAgICAgICAgICAgICAgICAgICAgeCA9IGR1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIHkgPSBkaWZmZXJlbmNlLCAKICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IG1vbnRoKSwKICAgICAgICAgICAgICAgICAgIGJveC5wYWRkaW5nID0gMC41LAogICAgICAgICAgICAgICAgICAgbnVkZ2VfeCA9IDAuMiwKICAgICAgICAgICAgICAgICAgIHNpemUgPSA3LAogICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQ9RkFMU0UpICsgCiAgbGFicyh4ID0gIlBhcmVudGFsIEV4cG9zdXJlIER1cmF0aW9uIiwgCiAgICAgICB5ID0gIkVmZmVjdCBTaXplIChIZWRnZSdzIGcpXG5IZWF0d2F2ZSAtIENvbnRyb2wiKSArIAogIHlsaW0oLTUsNSkgKyAKICB0aGVtZV9wdWJyKGJhc2Vfc2l6ZSA9IDE4KQpgYGAKCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcmRhdGEgPSBmaWxlX2xpc3Rbc3RyX2RldGVjdChmaWxlX2xpc3QsIHBhdHRlcm4gPSAiLlJEYXRhIildCiMgZjFfZGF0YSA9IHJkYXRhW3N0cl9kZXRlY3QocmRhdGEsIHBhdHRlcm4gPSAiRjBfIiwgbmVnYXRlID0gVCldICU+JSAKIyAgIHN0cl9zcGxpdF9maXhlZChwYXR0ZXJuID0gIi5SRGF0YSIsIG4gPSAyKQojIGYxX2RhdGEgPSBmMV9kYXRhWywxXQojIAojIHBsb3RfbmFtZXMgPSBjKCkKIyBmb3IoaSBpbiAxOmxlbmd0aChmMV9kYXRhKSl7CiMgICBwbG90X25hbWUgPSBwYXN0ZShmMV9kYXRhW2ldLCAiX3Bsb3QiLCBzZXAgPSAiIikKIyAgIHBsb3RfbmFtZXMgPSBjKHBsb3RfbmFtZXMsIHBsb3RfbmFtZSkKIyAgIG1ldHJpYyA9IHN0cl9zcGxpdF9maXhlZChwbG90X25hbWUsIHBhdHRlcm4gPSAiXyIsIG4gPSA0KVssMl0KIyAgIAojICAgaWYobWV0cmljID09ICJ0b3RhbCIpewojICAgICBsYWJlbCA9ICJFZ2cgUHJvZHVjdGlvbiAocGVyIGZlbWFsZSkiCiMgICB9CiMgICAKIyAgIGlmKG1ldHJpYyA9PSAicmYiKXsKIyAgICAgbGFiZWwgPSAiUHJvZHVjdGlvbiAocGVyIGZlbWFsZSkiCiMgICB9CiMgICAKIyAgIGlmKG1ldHJpYyA9PSAiaHMiKXsKIyAgICAgbGFiZWwgPSAiSGF0Y2hpbmcgU3VjY2VzcyAoJSkiCiMgICB9CiMgICAKIyAgIGlmKG1ldHJpYyA9PSAiYnMiKXsKIyAgICAgbGFiZWwgPSAiQm9keSBTaXplIChtbSkiCiMgICB9CiMgICAKIyAgIGFzc2lnbihwbG90X25hbWUsCiMgICAgICAgICAgcGxvdChnZXQoZjFfZGF0YVtpXSksIAojICAgICAgICAgICAgICAgZWZmc2l6ZS5tYXJrZXJzaXplID0gMiwKIyAgICAgICAgICAgICAgIGF4ZXMudGl0bGUuZm9udHNpemUgPSA5LAojICAgICAgICAgICAgICAgdGljay5mb250c2l6ZSA9IDYsCiMgICAgICAgICAgICAgICBzd2FybXBsb3QucGFyYW1zID0gcGFyYW1fbGlzdCwKIyAgICAgICAgICAgICAgIHJhd3Bsb3QueWxhYmVsID0gbGFiZWwsCiMgICAgICAgICAgICAgICB0aGVtZSA9IGdncHVicjo6dGhlbWVfcHVicigpKSkKIyB9CiMgCiMgYnNfcGxvdHMgPSBwbG90X25hbWVzW3N0cl9kZXRlY3QocGxvdF9uYW1lcywgcGF0dGVybiA9ICJfYnNfIildCiMgcmZfcGxvdHMgPSBwbG90X25hbWVzW3N0cl9kZXRlY3QocGxvdF9uYW1lcywgcGF0dGVybiA9ICJfcmZfIildCiMgdG90YWxfcGxvdHMgPSBwbG90X25hbWVzW3N0cl9kZXRlY3QocGxvdF9uYW1lcywgcGF0dGVybiA9ICJfdG90YWxfIildCiMgaHNfcGxvdHMgPSBwbG90X25hbWVzW3N0cl9kZXRlY3QocGxvdF9uYW1lcywgcGF0dGVybiA9ICJfaHNfIildCmBgYAoKYGBge3IgRjEtYm9keS1zaXplLWVmZi1wbG90cywgZmlnLmhlaWdodD0xMSwgZmlnLndpZHRoPTgsIGluY2x1ZGUgPSBGfQojIGdnYXJyYW5nZShKdW5lX2JzX3Nob3J0X3Bsb3QsIEp1bmVfYnNfbG9uZ19wbG90LCAKIyAgICAgICAgICAgQXVndXN0X2JzX3Nob3J0X3Bsb3QsIEF1Z3VzdF9ic19sb25nX3Bsb3QsCiMgICAgICAgICAgIE5vdmVtYmVyX2JzX3Nob3J0X3Bsb3QsIE5vdmVtYmVyX2JzX2xvbmdfcGxvdCwKIyAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAzLAojICAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIsCiMgICAgICAgICAgIHZqdXN0ID0gLTAuMikKYGBgCgpgYGB7ciBGMS10b3RhbC1lcHItZWZmLXBsb3RzLCBmaWcuaGVpZ2h0PTExLCBmaWcud2lkdGg9OCwgaW5jbHVkZSA9IEZ9CiMgZ2dhcnJhbmdlKEp1bmVfdG90YWxfc2hvcnRfcGxvdCwgSnVuZV90b3RhbF9sb25nX3Bsb3QsIAojICAgICAgICAgICBBdWd1c3RfdG90YWxfc2hvcnRfcGxvdCwgQXVndXN0X3RvdGFsX2xvbmdfcGxvdCwKIyAgICAgICAgICAgTm92ZW1iZXJfdG90YWxfc2hvcnRfcGxvdCwgTm92ZW1iZXJfdG90YWxfbG9uZ19wbG90LAojICAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDMsCiMgICAgICAgICAgIGxhYmVscyA9ICJBVVRPIiwKIyAgICAgICAgICAgdmp1c3QgPSAtMC4yKQpgYGAKCmBgYHtyIEYxLWhhdGNoaW5nLXN1Y2Nlc3MtZWZmLXBsb3RzLCBmaWcuaGVpZ2h0PTExLCBmaWcud2lkdGg9OCwgaW5jbHVkZSA9IEZ9CiMgZ2dhcnJhbmdlKEp1bmVfaHNfc2hvcnRfcGxvdCwgSnVuZV9oc19sb25nX3Bsb3QsIAojICAgICAgICAgICBBdWd1c3RfaHNfc2hvcnRfcGxvdCwgQXVndXN0X2hzX2xvbmdfcGxvdCwKIyAgICAgICAgICAgTm92ZW1iZXJfaHNfc2hvcnRfcGxvdCwgTm92ZW1iZXJfaHNfbG9uZ19wbG90LAojICAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDMsCiMgICAgICAgICAgIGxhYmVscyA9ICJBVVRPIiwKIyAgICAgICAgICAgdmp1c3QgPSAtMC4yKQpgYGAKCmBgYHtyIEYxLXByb2R1Y3Rpb24tZWZmLXBsb3RzLCBmaWcuaGVpZ2h0PTExLCBmaWcud2lkdGg9OCwgaW5jbHVkZSA9IEZ9CiMgZ2dhcnJhbmdlKEp1bmVfcmZfc2hvcnRfcGxvdCwgSnVuZV9yZl9sb25nX3Bsb3QsIAojICAgICAgICAgICBBdWd1c3RfcmZfc2hvcnRfcGxvdCwgQXVndXN0X3JmX2xvbmdfcGxvdCwKIyAgICAgICAgICAgTm92ZW1iZXJfcmZfc2hvcnRfcGxvdCwgTm92ZW1iZXJfcmZfbG9uZ19wbG90LAojICAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDMsCiMgICAgICAgICAgIGxhYmVscyA9ICJBVVRPIiwKIyAgICAgICAgICAgdmp1c3QgPSAtMC4yKQpgYGAKCmBgYHtyIEYxLWJvZHktc2l6ZS12cy10ZW1wZXJhdHVyZSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTV9CnNlYXNvbmFsX2NvbHMgPSBjKCJKdW5lIiA9ICIjRTY5RjAwIiwgIkF1Z3VzdCIgPSAiI0Q1NUUwMCIsICJOb3ZlbWJlciIgPSAiIzAwNzJCMiIpCkYxX2ZicyRJRCA9IHBhc3RlKEYxX2ZicyRNb250aCwgRjFfZmJzJFBhcmVudGFsX3RyZWF0bWVudCwgRjFfZmJzJERheSwgc2VwID0gIl8iKQpGMV9mYnMkTW9udGggPSBmY3RfcmVsZXZlbChGMV9mYnMkTW9udGgsICJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpCgpkYXlfY29scyA9IGMoIjFfdG9fMyIgPSAic2llbm5hMSIsICI1X3RvXzciID0gInNpZW5uYSIpCgpzaXplX3RlbXAxID0gZ2dwbG90KEYxX2ZicywgYWVzKHggPSBPZmZzcHJpbmdfdGVtcCwgeSA9IFNpemUsIGNvbG91ciA9IERheSwgZ3JvdXAgPSBJRCkpICsgCiAgZmFjZXRfZ3JpZChNb250aH5QYXJlbnRhbF90cmVhdG1lbnQpICsgCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjUsIHNpemUgPSAxLjYsIGFscGhhID0gMC40KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2l6ZSA9IDEuNCwgYWxwaGEgPSAwLjIpICsgCiAgbGFicyh4ID0gIk9mZnNwcmluZyBUZW1wZXJhdHVyZSAowrBDKSIsCiAgICAgICB5ID0gIlNpemUgKG1tKSIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoMTIsMTcsMjIpKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gZGF5X2NvbHMpICsgCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTUpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgpmMV9zaXplLm1vZGVsID0gbG0oZGF0YSA9IEYxX2ZicywgU2l6ZSB+IE9mZnNwcmluZ190ZW1wICogUGFyZW50YWxfdHJlYXRtZW50ICogTW9udGggKiBEYXkpCgojY2FyOjpBbm92YShmMV9zaXplLm1vZGVsLCB0eXBlID0gIklJSSIpCnNpemVfdGVtcDIgPSBlbW1lYW5zOjplbXRyZW5kcyhmMV9zaXplLm1vZGVsLCBjKCJNb250aCIsICJEYXkiLCAiUGFyZW50YWxfdHJlYXRtZW50IiksIHZhciA9ICJPZmZzcHJpbmdfdGVtcCIpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIGdncGxvdChhZXMoeCA9IFBhcmVudGFsX3RyZWF0bWVudCwgeSA9IE9mZnNwcmluZ190ZW1wLnRyZW5kLCAKICAgICAgICAgICAgIGNvbG91ciA9IERheSwgc2hhcGUgPSBEYXksIGdyb3VwID0gRGF5KSkgKyAKICBmYWNldF93cmFwKE1vbnRofi4pICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGxvd2VyLkNMLCB5bWF4ID0gdXBwZXIuQ0wpLAogICAgICAgICAgICAgICAgc2l6ZSA9IDEsIHdpZHRoID0gMC4zLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsgCiAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEuNSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gZGF5X2NvbHMpICsgCiAgbGFicyh4ID0gIlBhcmVudGFsIFRyZWF0bWVudCIsICAKICAgICAgIHkgPSAiU2l6ZSBTbG9wZSAobW0gLyDCsEMpIikgKyAKICBndWlkZXMoY29sb3VyID0gIm5vbmUiKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTUpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzNjAtNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwLCB2anVzdCA9IDAuNSkpCgpnZ2FycmFuZ2Uoc2l6ZV90ZW1wMSwgc2l6ZV90ZW1wMiwgbGFiZWxzID0gIkFVVE8iLCBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kID0gImJvdHRvbSIpCmBgYAo=